"""
Meme API 路由定义 (routes/meme_routes.py)

使用 Flask Blueprint 组织表情包相关的 API 端点。
"""
from flask import Blueprint, jsonify, request, current_app
from models.meme import load_memes, get_meme_by_id
from services.meme_service import (
    create_meme, like_meme, get_templates, get_latest_templates,
    get_latest_memes, search_memes_by_tag
)
from models.db_models import Upload
from models import db_session
import logging

# 日志配置
logger = logging.getLogger(__name__)

# Meme 蓝图
meme_bp = Blueprint('memes', __name__)

@meme_bp.route('/memes', methods=['GET'])
def get_memes_route():
    """API 端点：获取所有 Meme 列表。"""
    memes = get_all_memes()
    return jsonify(memes)

@meme_bp.route('/memes/<meme_id>', methods=['GET'])
def get_single_meme_route(meme_id):
    """
    API 端点：获取单个 Meme。
    
    Args:
        meme_id: Meme 的 ID。
    """
    meme = get_meme_by_id(meme_id)
    if not meme:
        return jsonify({"error": "Meme not found"}), 404
    
    return jsonify(meme)

@meme_bp.route('/memes', methods=['POST'])
def create_new_meme_route():
    """API 端点：创建新的 Meme。"""
    if not request.json:
        return jsonify({"error": "无效请求，需要 JSON 数据"}), 400
    
    data = request.json
    new_meme, error = create_meme(data)
    
    if error:
        return jsonify({"error": error}), 400
        
    return jsonify(new_meme), 201 # 201 Created

@meme_bp.route('/memes/<meme_id>/like', methods=['POST'])
def like_single_meme_route(meme_id):
    """API 端点：为指定 Meme 点赞。"""
    meme, error = like_meme(meme_id)
    
    if error:
        return jsonify({"error": error}), 404
        
    return jsonify(meme)

@meme_bp.route('/templates', methods=['GET'])
def get_meme_templates_route():
    """API 端点：获取可用的 Meme 模板列表。"""
    templates = get_templates()
    return jsonify(templates)

@meme_bp.route('/latest-templates', methods=['GET'])
def get_latest_templates_route():
    """API 端点：获取最新的表情包模板列表，支持分页。"""
    try:
        # 获取分页参数
        page = request.args.get('page', default=1, type=int)
        limit = request.args.get('limit', default=10, type=int)
        
        # 验证分页参数
        if page < 1:
            page = 1
        if limit < 1 or limit > 100:  # 设置合理的限制范围
            limit = 10
            
        # 调用服务函数获取数据
        result = get_latest_templates(page, limit)
        return jsonify(result)
    except Exception as e:
        return jsonify({"error": f"获取最新表情包列表时出错: {str(e)}"}), 500

# 添加获取最新上传的表情包接口
@meme_bp.route('/latest-memes', methods=['GET'])
def get_latest_memes_route():
    """API 端点：获取最新上传的表情包列表，支持分页，数据来自uploads表和目录。"""
    try:
        # 获取分页参数
        page = request.args.get('page', default=1, type=int)
        limit = request.args.get('limit', default=10, type=int)
        
        # 验证分页参数
        if page < 1:
            page = 1
        if limit < 1 or limit > 100:  # 设置合理的限制范围
            limit = 10
            
        # 调用服务函数获取数据
        result = get_latest_memes(page, limit)
        return jsonify(result)
    except Exception as e:
        return jsonify({"error": f"获取最新表情包列表时出错: {str(e)}"}), 500

# 添加按标签搜索表情包的接口
@meme_bp.route('/memes/search/tag', methods=['GET'])
def search_memes_by_tag_route():
    """API 端点：根据标签关键字搜索表情包，支持分页。"""
    try:
        # 获取查询参数
        tag_keyword = request.args.get('keyword', '')
        page = request.args.get('page', default=1, type=int)
        limit = request.args.get('limit', default=10, type=int)
        
        # 验证参数
        if not tag_keyword:
            return jsonify({"error": "标签关键字不能为空"}), 400
            
        if page < 1:
            page = 1
        if limit < 1 or limit > 100:  # 设置合理的限制范围
            limit = 10
            
        # 调用服务函数获取数据
        result = search_memes_by_tag(tag_keyword, page, limit)
        return jsonify(result)
    except Exception as e:
        return jsonify({"error": f"搜索表情包时出错: {str(e)}"}), 500

# 添加一个开发测试用的路由，用于生成带标签的测试数据
@meme_bp.route('/test/generate-tagged-memes', methods=['GET'])
def generate_tagged_memes_route():
    """
    [仅开发测试用] API 端点：生成带标签的测试表情包数据。
    此端点仅用于开发测试，不应在生产环境中使用。
    """
    from models.db_models import Upload
    from models import db_session
    import uuid
    from datetime import datetime
    import random
    import json
    
    try:
        # 生成的测试数据数量
        count = request.args.get('count', default=10, type=int)
        if count > 50:  # 限制最大数量
            count = 50
            
        # 标签库
        tag_categories = {
            '表情类型': ['搞笑', '悲伤', '愤怒', '惊讶', '开心', '无语', '疑惑', '期待', '害怕'],
            '来源': ['动漫', '电影', '电视剧', '游戏', '明星', '网络', '原创'],
            '人物': ['蜡笔小新', '海绵宝宝', '派大星', '皮卡丘', '猫和老鼠', '漫威', 'DC'],
            '场景': ['学习', '工作', '生活', '恋爱', '社交', '聚会', '旅行', '吃饭', '睡觉'],
            '动物': ['猫', '狗', '兔子', '熊猫', '老虎', '狮子', '大象', '猴子']
        }
        
        # 测试 URL 前缀
        url_prefix = 'https://picsum.photos/seed/'
        
        from config.config import APP_CONFIG
        
        session = db_session()
        created_memes = []
        
        for i in range(count):
            # 随机生成 2-5 个标签
            tags = []
            # 从每个类别中随机选择 0-1 个标签
            for category, category_tags in tag_categories.items():
                if random.random() > 0.5:  # 50% 概率选择此类别的标签
                    tags.append(random.choice(category_tags))
                    
            # 确保至少有 2 个标签
            while len(tags) < 2:
                category = random.choice(list(tag_categories.keys()))
                tag = random.choice(tag_categories[category])
                if tag not in tags:
                    tags.append(tag)
            
            # 创建测试数据
            meme_id = str(uuid.uuid4())
            
            # 使用一些测试图片
            size = random.choice(['300', '400', '500', '600'])
            url = f"{url_prefix}{meme_id}/{size}/{size}"
            
            # 确保 tags 字段使用正确的 JSON 格式，以便在不同 MySQL 版本中工作
            # 标签必须是一个 Python 列表，SQLAlchemy 会自动将其转换为兼容的格式
            
            # 创建新的上传记录
            new_meme = Upload(
                id=meme_id,
                name=f"测试表情包 {i+1}",
                description=f"这是一个带有标签的测试表情包 {i+1}",
                original_name=f"test_meme_{i+1}.jpg",
                saved_name=f"{meme_id}.jpg",
                url=url,
                file_path=f"uploads/{meme_id}.jpg",
                file_size=random.randint(10000, 500000),
                file_type="image/jpeg",
                created_by="测试用户",
                created_at=datetime.utcnow(),
                likes=random.randint(0, 100),
                tags=tags  # 确保这是 Python 列表
            )
            session.add(new_meme)
            
            # 添加到结果列表
            created_memes.append({
                'id': meme_id,
                'name': new_meme.name,
                'tags': tags,
                'url': url
            })
            
        # 提交所有更改
        session.commit()
        session.close()
        
        return jsonify({
            'message': f'成功生成 {len(created_memes)} 个带标签的测试表情包',
            'memes': created_memes
        })
            
    except Exception as e:
        return jsonify({"error": f"生成测试数据时出错: {str(e)}"}), 500

# 添加获取所有可用标签的接口
@meme_bp.route('/tags', methods=['GET'])
def get_all_tags_route():
    """API 端点：获取所有可用的标签列表。"""
    from models.db_models import Tag, Upload
    from collections import Counter
    import json
    
    try:
        session = db_session()
        
        # 尝试从 Tag 表获取标签统计
        try:
            tags = session.query(Tag).order_by(Tag.count.desc()).all()
            
            if tags:
                # 转换为字典列表
                result = [{
                    'id': tag.id,
                    'name': tag.name,
                    'count': tag.count
                } for tag in tags]
                
                session.close()
                return jsonify(result)
        except Exception as e:
            # Tag 表可能不存在或查询出错，继续尝试从 Upload 表提取
            pass
            
        # 如果 Tag 表不可用，直接从 Upload 中提取所有标签
        uploads = session.query(Upload).filter(Upload.tags != None).all()
        
        # 使用 Counter 统计标签出现次数
        tag_counter = Counter()
        
        for upload in uploads:
            if upload.tags:
                for tag in upload.tags:
                    if isinstance(tag, str) and tag.strip():
                        tag_counter[tag.strip()] += 1
        
        # 转换为字典列表
        result = [{'name': tag, 'count': count} for tag, count in tag_counter.most_common()]
        
        session.close()
        return jsonify(result)
    except Exception as e:
        return jsonify({"error": f"获取标签列表时出错: {str(e)}"}), 500 